package com.knowledge.review.designPatterns.behavioralpattern.observermode;

import lombok.AllArgsConstructor;

import java.util.ArrayList;
import java.util.List;

// 抽象观察者接口
public interface Observer {
    void update(String message);
}
// 微信用户类 具体的观察者
@AllArgsConstructor
class WeixinUser implements Observer {
    private String name;
    @Override
    public void update(String message) {
        System.out.println(name + "接收到了消息(观察到了):" + message);
    }
}
// 被观察者接口
interface Observable {
    // 新增用户(新增观察者)
    void add(Observer observer);
    // 移除用户,或者说用户取消订阅(移除观察者)
    void del(Observer observer);
    // 发布 推送消息
    void notify(String message);
}
// 具体的被观察者(公众号)
class Subject implements Observable {
    // 观察者列表(订阅用户)
    private List<Observer> list = new ArrayList<>();
    @Override
    public void add(Observer observer) {
        list.add(observer);
    }
    @Override
    public void del(Observer observer) {
        list.remove(observer);
    }
    // 给每一个观察者(订阅者)推送消息
    @Override
    public void notify(String message) {
        list.forEach(observer -> observer.update(message));
    }
 
}

class Test{
    // 测试
    public static void main(String[] args){
        Observable o = new Subject();
        WeixinUser user1 = new WeixinUser("张三");
        WeixinUser user2 = new WeixinUser("李四");
        WeixinUser user3 = new WeixinUser("王五");
        o.add(user1);
        o.add(user2);
        o.add(user3);
        o.notify("薛之谦演唱会要来到广州啦!");
        // 运行结果
        // 张三接收到了消息(观察到了):薛之谦演唱会要来到广州啦!
        // 李四接收到了消息(观察到了):薛之谦演唱会要来到广州啦!
        // 王五接收到了消息(观察到了):薛之谦演唱会要来到广州啦!
    }
}
 